[Alexa] SkillBuilder(Betaリリース)を使用してDialogモデルを使ってみた
1 はじめに
Amazonの開発者コンソールで作業するCustom Skillの作成では、Interaction Modelで、Skill Builder(Betaリリース) を使用することができます。
Skill Builderでは、従来、テキストエリアにJSONを手動入力することで行なっていた作業を、美しいGUIから行えるようになります。
Interaction Modelの設定では、インテント、スロット、カスタムスロット、及び、それに関する発話について定義しますが、Skill Builderでは、それらに加えてDialogモデルを設定することができるようになりました。
今回は、このDialogモデルを試してみましたので、紹介させてください。
なお、作業は、Skill Builderの中で紹介されている、下記のビデオを元に進めました。
Alexa Skill BUlder - Part 3:Simplifying your code for multi-turn dialogs
2 Dialogモデル
Dialogモデルを使用すると、インテントの中で必要となるスロットの収集を、Alexaに任せる事ができるようになります。
例えば、旅行のプランを処理するインテント(planMyTrip)では、必要なスロットが「出発地(fromCity)」「目的地(toCity)」「旅行日(travelDate)」だった場合、Sample Utterancesで下記のように設定しておけば、ユーザがそのとおり発話してくれれば、一気にスロットの収集が完了します。
I'm want to travel from {fromCity} to {toCity} on {travelDate}
しかし、上記の設定だけでは、当該インテントへの誘導は難しいため、通常、Sample Utterancesには、以下のような指定も追加されます。
I'm going on a trip to {toCity} I'm leaving {travelDate} I'm going to take the train to {toCity} from {fromCity}
そして、これらのSample UtterancesでIntentに誘導された場合は、必要なスロットが欠けているため、Skillは更なる質問をユーザに返して、必要なスロット値を収集する実装が必要になります。
Dialogモデルは、このような実装を、Skill側の実装で行うのではなく、Interaction Modelで行おうとするものです。
Skillでは、全てのスロットが揃うまで、特に作業が必要なくなるので、待っているだけで良いことになります。
Dialogモデルは、必須となるスロットで、REQにチェックを入れると有効になります。
3 Interaction Modelの設定
以下は、ビデオの中で作業しているInteraction Modelの設定です。
(1) Intentの追加と、Sample Utterancesの設定
最初に、Intentを追加して、そのSample Utterancesを定義しています。この作業自体は、JSONで指定していた時と同じですが、入力が補完されたり、{}を入力するだけで、それが自動的にスロットそして認識されて一覧リストアップされたりします。
(2) SlotのType指定
スロットのタイプについては、リストからの選択で行う事ができます。タイプ指定は、JSONの設定でも行なっていました。
(3) SlotのPromptsとUtterances
最後は、各スロットの設定ですが、スロットに値が入っていない時、ユーザへそれを要求するためのPromptsと、その返答を受け取るためのUtterancesを設定しています。
こちらは、JSONの時には無かったもので、従来Skill側で実装されたいた部分です。
特に優れているのは、1つのスロットの要求で、さらなる別のスロットも受け取れる点です。例としては、旅行日(travelDate)の入力要求に対して、ユーザが、「次の日曜日にサンプランシスコへ行きます」というように、目的地についても返答した場合、下記のようなUtterancesを設定しておく事で、それも受け取る事ができます。
I'ii leave on {travelDate} and goto {toCity}
これは、Amazon Lexに非常によく似た仕様だと思います。
4 Alexaからのリクエスト
Dialogモデルを使用した場合は、AlexaからSkillへ送られるリクエストは次のようになっています。
"request": { "type": "IntentRequest", "requestId": "amzn1.echo-api.request.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx", "timestamp": "2017-07-15T01:47:13Z", "locale": "en-US", "intent": { "name": "planMyTrip", "confirmationStatus": "NONE", "slots": { "toCity": { "name": "toCity", "value": "Chicago", "confirmationStatus": "NONE" }, "travelDate": { "name": "travelDate", "value": "2017-07-13", "confirmationStatus": "NONE" }, "fromCity": { "name": "fromCity", "confirmationStatus": "NONE" } } }, "dialogState": "IN_PROGRESS" }
slotsを見ると、現時点でtoCity及びtravelDateに値が取得できている事が分かります。
また、dialogStateは、下記の3種類の値をとり、現時点では、収集中ということになります。
- IN_STARTED スロット値の収集開始
- IN_PROGRESS スロット値の収集中
- IN_COMPLETED 全スロットの収集を完了
5 Skillの実装
Alexa SDKを使用している場合、Skill側の実装は、極めて簡単です。
下記の例では、Slotのデフォルト値の設定を行なっていますが、そういうのが必要なければ、単純にdialogStateがCOMPLETEDになるまで、ひたすら、this.emit(':delegate') を返すだけです。
var handlers = { 'planMyTrip': function () { if (this.event.request.dialogState === 'STARTED') { // スロットにデフォルト値を設定したい場合 var updatedIntent = this.event.request.intent; updatedIntent.slots.SlotName.value = 'DefaultValue'; this.emit(':delegate', updatedIntent); } else if (this.event.request.dialogState !== 'COMPLETED'){ this.emit(':delegate'); } else { // 全てのストッロ値が揃った時の処理 handlePlanMyTripIntent(); } } };
6 制限
非常に快適なDialogモデルですが、下記のような制限に注意が必要です。
(1) YesIntent/NoIntentは使用できない
「はい」や「いいえ」のような簡単なフレーズは、使用できません。そのため、「更に、別のものを追加しますか?」というような質問が必要な場合、Dialogモードは使用できません。
(2) 標準ページに戻るとDialogモードの設定は削除される
Dialogモデルは、従来のSkillエディタでは使用できないため、標準エディタに戻ると、Dialogモデルの設定は消去されます。
(3) 自動的に保存されない
Skill Builderは、変更を自動的に保存しません。 Modelの保存をクリックせずにブラウザウィンドウを閉じると、作業が失われてしまいます。
7 最後に
今回は、Dialogモデルの動作について確認してみました。
Dialogモデルを使用すると、「必要なスロットを要求するためのユーザとのインタラクション」という、比較的、煩雑となりがちな作業をInteraction Modelの設定に押し込む事ができます。
これにより、Skillの作成は、よりロジックに集中できるようになるかも知れません。
8 参考リンク
Alexa Skill BUlder - Part 3:Simplifying your code for multi-turn dialogs
Use the Skill Builder (Beta) to Define Intents, Slots, and Dialogs
Announcing New Alexa Skill Builder (Beta), a Tool for Creating Skills
Dialog Interface Reference
Alexa Skills Kit for Node.js はじめの一歩
Alexa Skills Kit for Node.js 次の一歩(DynamoDB)